import options from './LLMOptions'
/**
 * 获取页面 DOM 内容并生成问题模板
 * @param {string} question - 用户的问题
 * @returns {Promise<string>} - 返回生成的问题模板
 */
export function useQuestionTemplate(question) {
  return new Promise((resolve) => {
    try {
      console.log('useQuestionTemplate');
      chrome.runtime.sendMessage({ action: 'getDOM4Service' }, (response) => {
        if (!response || !response.success || !options.tip.includes(question)) {
          resolve(question); // 如果获取 DOM 失败，或者不含关键字，直接提问
        } else {
          const { title, keywords, description, bodyTexts } = parseDOM(response.dom);
          const backgroundContent = [
            title && `网站名称：${title}`,
            keywords && `网站关键字：${keywords}`,
            description && `网站描述：${description}`,
            ...bodyTexts,
          ].filter(Boolean).join(',');
          console.log('backgroundContent', backgroundContent);
          resolve("下面的信息是当前页面元素，请根据提供的元素总结网站用途：" + backgroundContent.replace(/\n/g, ',')); // 生成带背景内容的模板
        }
      });
    } catch (error) {
      console.error('useQuestionTemplate error:', error);
      //resolve(generateTemplate(question)); // 如果发生错误，生成默认模板
    }
  });
}

/**
 * 解析 DOM 内容，提取标题、关键字、描述和正文文本
 * @param {string} domString - DOM 字符串
 * @returns {Object} - 包含标题、关键字、描述和正文文本的对象
 */
function parseDOM(domString) {
  const parser = new DOMParser();
  const doc = parser.parseFromString(domString, 'text/html');

  const title = doc.querySelector('title')?.textContent || null;
  const keywords = doc.querySelector('meta[name="keywords"]') ? doc.querySelector('meta[name="keywords"]').getAttribute('content') : doc.querySelector('meta[http-equiv="keywords"]') ? doc.querySelector('meta[http-equiv="keywords"]').getAttribute('content') : '';
  const description = doc.querySelector('meta[name="description"]') ? doc.querySelector('meta[name="description"]').getAttribute('content') : doc.querySelector('meta[http-equiv="description"]') ? doc.querySelector('meta[http-equiv="description"]').getAttribute('content') : '';
  const bodyTexts = useCollectTextContent(doc.body) || [];

  return { title, keywords, description, bodyTexts };
}

/**
 * 从给定的 DOM 节点 body 中提取可见且非空的文本内容，并返回一个包含这些文本内容的数组
 * @param {node} body - body 节点
 * @returns {string[]} texts- 包含所有文本内容的数组
 */
export function useCollectTextContent(body) {
  const texts = [];

  // 创建 TreeWalker 实例
  const treeWalker = document.createTreeWalker(
    body, // 根节点
    NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT, // 过滤条件：文本节点和元素节点
    {
      acceptNode(node) {
        // 过滤掉隐藏元素、SVG、script、style 等
        if (node.nodeType === Node.ELEMENT_NODE) {
          if (
            node.style.display === 'none' || // 隐藏元素
            node.style.visibility === 'hidden' || // 不可见元素
            ['svg', 'script', 'style'].includes(node.tagName.toLowerCase()) // 不需要的元素
          ) {
            return NodeFilter.FILTER_REJECT; // 跳过该节点及其子节点
          }
        }

        // 过滤掉空文本节点
        if (node.nodeType === Node.TEXT_NODE && node.textContent.trim() === '') {
          return NodeFilter.FILTER_REJECT; // 跳过空文本节点
        }

        // 接受符合条件的节点
        return NodeFilter.FILTER_ACCEPT;
      },
    }
  );

  // 遍历节点
  while (treeWalker.nextNode()) {
    const node = treeWalker.currentNode;

    // 如果是文本节点，则收集内容
    if (node.nodeType === Node.TEXT_NODE) {
      texts.push(node.textContent.trim());
    }
  }

  return texts;
}

/**
 * 生成问题模板
 * @param {string} question - 用户的问题
 * @param {string} [backgroundContent=''] - 背景内容
 * @returns {string} - 生成的问题模板
 */
function generateTemplate(question, backgroundContent = '') {
  return `你是一个智能助手，专门用于回答用户的问题。请仔细阅读以下信息，根据用户问题与背景内容是否有相关性来决定怎么回答问题，具体规则如下指示

## 指示
规则A：如果用户的问题与背景内容无相关性
1. 忽略背景内容
2. 忽略规则B
3. 直接回答用户的问题或者解释用户当前提问信息，并给出一个总结。
4. 回复内容中禁止提及“用户的问题与背景内容无关“等类型语义信息

规则B： 如果用户问题与背景内容有相关性，则遵循以下规则回答问题：
1. 仔细分析用户的问题和提供的背景内容。
2. 确保你的回答直接针对用户的问题。
3. 利用提供的背景内容来支持你的回答,但不要仅仅重复这些信息。
4. 如果背景内容中有任何不清楚或矛盾的地方,请在回答中指出并寻求澄清。
5. 使用清晰、简洁的语言,避免使用过于技术性的术语(除非问题本身是技术性的)。
6. 如果问题涉及多个方面,请分点回答以提高清晰度。
7. 如果合适的话,提供例子来说明你的观点。
8. 如果你不确定某个信息,诚实地表示你的不确定性。
9. 如果问题需要更多信息才能全面回答,请指出这一点并询问用户是否可以提供更多细节。

## 用户的问题
[${question}]

## 背景内容
[${backgroundContent}]`;
}